package org.rhq.metrics.simulator;
import java.util.Iterator;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
import com.codahale.metrics.Timer;
import com.google.common.base.Stopwatch;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.joda.time.Days;
import org.joda.time.Duration;
import org.joda.time.Hours;
import org.rhq.core.domain.measurement.composite.MeasurementDataNumericHighLowComposite;
import org.rhq.server.metrics.MetricsServer;
/**
* @author John Sanda
*/
public class MeasurementReader implements Runnable {
private final Log log = LogFactory.getLog(MeasurementReader.class);
private long intervalRate;
private Metrics metrics;
private MetricsServer metricsServer;
private int startingSchedule;
private int batchSize;
public MeasurementReader(long intervalRate, Metrics metrics, MetricsServer metricsServer, int startingSchedule,
int batchSize) {
this.intervalRate = intervalRate;
this.metrics = metrics;
this.metricsServer = metricsServer;
this.startingSchedule = startingSchedule;
this.batchSize = batchSize;
}
@Override
public void run() {
Timer.Context context = metrics.totalReadTime.time();
Stopwatch stopwatch = new Stopwatch().start();
try {
log.info("Running metrics queries");
ThreadLocalRandom random = ThreadLocalRandom.current();
int bound = startingSchedule + batchSize;
findResourceDataForPast24Hours(random.nextInt(startingSchedule, bound));
findResourceDataForPastWeek(random.nextInt(startingSchedule, bound));
findResourceDataForPast2Weeks(random.nextInt(startingSchedule, bound));
findResourceDataForPast31Days(random.nextInt(startingSchedule, bound));
findResourceDataForPastYear(random.nextInt(startingSchedule, bound));
} finally {
stopwatch.stop();
log.info("Finished running metrics queries in " + stopwatch.elapsed(TimeUnit.MILLISECONDS) + " ms");
context.stop();
}
}
private void findResourceDataForPast24Hours(int scheduleId) {
Duration duration = Hours.hours(24).toStandardSeconds().toStandardDuration();
findResourceData(scheduleId, duration, metrics.twentyFourHourResourceQueryTime);
}
private void findResourceDataForPastWeek(int scheduleId) {
Duration duration = Days.SEVEN.toStandardSeconds().minus(5).toStandardDuration();
findResourceData(scheduleId, duration, metrics.oneWeekResourceQueryTime);
}
private void findResourceDataForPast2Weeks(int scheduleId) {
Duration duration = Days.days(14).toStandardSeconds().minus(5).toStandardDuration();
findResourceData(scheduleId, duration, metrics.twoWeekResourceQueryTime);
}
private void findResourceDataForPast31Days(int scheduleId) {
Duration duration = Days.days(31).toStandardSeconds().minus(5).toStandardDuration();
findResourceData(scheduleId, duration, metrics.monthResourceQueryTime);
}
private void findResourceDataForPastYear(int scheduleId) {
Duration duration = Days.days(365).toStandardSeconds().minus(5).toStandardDuration();
findResourceData(scheduleId, duration, metrics.yearResourceQueryTime);
}
private void findResourceData(int scheduleId, Duration duration, Timer timer) {
long end = System.currentTimeMillis();
long start = end - (duration.getMillis() / intervalRate);
Timer.Context context = timer.time();
try {
Iterable<MeasurementDataNumericHighLowComposite> data = metricsServer.findDataForResource(scheduleId, start,
end, 60);
Iterator<MeasurementDataNumericHighLowComposite> iterator = data.iterator();
for (MeasurementDataNumericHighLowComposite datum : data) {
}
} finally {
context.stop();
}
}
}